package com.itheima.d3_regex;

//目标：了解正则表达式的规则（不记得就查API文档，搜索Pattern）
public class Demo2 {
    public static void main(String[] args) {
        // 1、字符类(只能匹配单个字符)
        // [abc] 只能匹配a、b、c
        System.out.println("a".matches("[abc]")); // true
        System.out.println("e".matches("[abcd]")); // false
        System.out.println("-----------");

        //[^abc] 不能是a、b、c
        System.out.println("d".matches("[^abc]")); // true
        System.out.println("a".matches("[^abc]")); // false
        System.out.println("-----------");

        //[a-zA-Z] 只能是a-z A-Z的字符
        System.out.println("b".matches("[a-zA-Z]")); // true
        System.out.println("2".matches("[a-zA-Z]")); // false
        System.out.println("-----------");

        //a到z，除了b和c
        System.out.println("k".matches("[a-z&&[^bc]]")); // true
        System.out.println("b".matches("[a-z&&[^bc]]")); // false
        System.out.println("-----------");

        //注意：以上带 [内容] 的规则都只能用于匹配单个字符，不能匹配多个字符
        System.out.println("ab".matches("[a-zA-Z0-9]")); // false
        System.out.println("-----------");

        // 2、预定义字符(只能匹配单个字符)  .  \d  \D   \s  \S  \w  \W
        // . 可以匹配任意一个字符
        System.out.println("徐".matches(".")); // true
        System.out.println("徐徐".matches(".")); // false
        System.out.println("-----------");

        //需求：打印符号"，直接打印，代码报错！语法解析错误
        //原因："在Java语法中代表字符串的开始或者结束，现在是想单纯的把它当成一个符号去使用
        //解决：使用转义字符，将有特殊作用的符号，变成单纯的符号，而不具备其他特殊作用
        //转义字符：\
        System.out.println("\"");

        // \d 表示数字，等价于[0-9]
        System.out.println("3".matches("\\d")); // true
        System.out.println("a".matches("\\d")); // false
        System.out.println("-----------");

        // \s 代表一个空白字符
        System.out.println(" ".matches("\\s")); // true
        System.out.println("a".matches("\\s")); // false
        System.out.println("-----------");

        // \S 代表一个非空白字符
        System.out.println("a".matches("\\S")); // true
        System.out.println(" ".matches("\\S")); // false
        System.out.println("-----------");

        //  \w 表示字母、数字、或下划线，等价于[a-zA-Z_0-9]
        System.out.println("a".matches("\\w")); // true
        System.out.println("_".matches("\\w")); // true
        System.out.println("徐".matches("\\w")); // false
        System.out.println("-----------");

        // \W 不是字母数字获取下划线，等价于[^a-zA-Z_0-9]
        System.out.println("徐".matches("\\W")); // true
        System.out.println("a".matches("\\W")); // false
        System.out.println("-----------");

        System.out.println("23232".matches("\\d")); // false

        // 3、数量词： ?   *   +   {n}   {n, }  {n, m}
        //? 代表0次或1次
        System.out.println("a".matches("\\w?")); // true
        System.out.println("".matches("\\w?")); // true
        System.out.println("abc".matches("\\w?")); // false
        System.out.println("-----------");

        //* 代表0次或多次
        System.out.println("abc12".matches("\\w*")); // true
        System.out.println("".matches("\\w*")); // true
        System.out.println("abc12张".matches("\\w*")); // false
        System.out.println("-----------");

        //+ 代表1次或多次
        System.out.println("abc12".matches("\\w+")); // true
        System.out.println("".matches("\\w+")); // false
        System.out.println("abc12张".matches("\\w+")); // false
        System.out.println("-----------");

        // {n} 代表要正好是n次
        System.out.println("a3c".matches("\\w{3}")); // true
        System.out.println("abcd".matches("\\w{3}")); // false
        System.out.println("-----------");

        //{n,} 代表是大于等于n次
        System.out.println("abcd".matches("\\w{3,}")); // true
        System.out.println("ab".matches("\\w{3,}")); // false
        System.out.println("abcde徐".matches("\\w{3,}")); // false
        System.out.println("-----------");

        //{n, m} 代表是大于等于n次，小于等于m次
        System.out.println("abc232d".matches("\\w{3,9}")); // true
        System.out.println("-----------");

        // 4、其他几个常用的符号：(?i)忽略大小写 、 或：| 、  分组：()
        System.out.println("abc".matches("(?i)abc")); // true
        System.out.println("ABC".matches("(?i)abc")); // true
        System.out.println("aBc".matches("a((?i)b)c")); // true
        System.out.println("ABc".matches("a((?i)b)c")); // false
        System.out.println("-----------");

        // 需求1：要求要么是3个小写字母，要么是3个数字。
        System.out.println("abc".matches("[a-z]{3}|\\d{3}")); // true
        System.out.println("ABC".matches("[a-z]{3}|\\d{3}")); // false
        System.out.println("123".matches("[a-z]{3}|\\d{3}")); // true
        System.out.println("A12".matches("[a-z]{3}|\\d{3}")); // false
        System.out.println("-----------");

        // 需求2：必须是 "我爱" 开头，中间可以是至少一个 "编程"，最后至少是1个 "666"
        System.out.println("我爱编程编程666666".matches("我爱(编程)+(666)+")); // true
        System.out.println("我爱编程编程66666".matches("我爱(编程)+(666)+")); // false
    }
}
